<?php

/**     
  *
  * Copyright (c) 2009, Persistent Systems Limited
  *
  * Redistribution and use, with or without modification, are permitted 
  *  provided that the following  conditions are met:
  *   - Redistributions of source code must retain the above copyright notice, 
  *     this list of conditions and the following disclaimer.
  *   - Neither the name of Persistent Systems Limited nor the names of its contributors 
  *     may be used to endorse or promote products derived from this software 
  *     without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 
  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 
  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 
  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */





/**
 * This function will take the array and generates the corresponding atom feed.
 *@param array $data This is the array required to generate entry tag in atom feed.
 *@param array $metadata  This is the array required to generate metadata entry tag in atom feed.
 *@param string $rootNodeName  This is the name of of root node of atom feed.( default is feed).
 *@param string $xml This is the node of xml
 *@return string This will return the atom feed.
 
 
*/

function toAtom($data,$metadata= null,$rootNodeName = 'feed', $xml=null) {			
	
	if ($xml == null) {			
		$xml = simplexml_load_string("<?xml version='1.0' encoding='utf-8'?><$rootNodeName xmlns='http://www.w3.org/2005/Atom'/>");
		
	}

	if($metadata!=null) {
		
		$data = array_merge($metadata,$data);

	}

	foreach($data as $key => $value){
		
		if (is_numeric($key)){	
			
			$key = 'entry';
		} 						

		if (is_array($value)){	
			
			$node = $xml->addChild($key);
			$node = $node->addChild("content");
			$node->addAttribute('type','application/xml');
			toAtom($value,null,$rootNodeName, $node);
		}			
		else 			{				                            
			$value = htmlentities($value);				
			$xml->addChild($key,$value);			
		} 		
	}

	return $xml->asXML();
}

/**
 * It returns the HTTP method name and request arguements. 
 * @param array $_SERVER It is a global varoable of php.
 * @param array $_GET It is a global varoable of php.
 * @param array $_POST It is a global varoable of php.
 * @return array $return It return array containing method name and requested arguements.
 */
function getMethodAndArguments($_SERVER, $_GET, $_POST) {
    
    $method = $_SERVER['REQUEST_METHOD'];
	$return = array();
    switch ($method) {
      case 'GET':
      case 'HEAD':
        $arguments = $_GET;
        break;
      case 'POST':
        $arguments = $_POST;
        break;
      case 'PUT':
      case 'DELETE':
        parse_str(file_get_contents("php://input"), $arguments);
	  
        break;
    }
    $accept = $_SERVER['HTTP_ACCEPT'];

	$return['method']    = $method;
	$return['arguments'] = $arguments;
	$return['accept']    = $accept;

	return $return;
   
  }

/**
 * This method returns the Header code message based on input header status code.. 
 * @param integer $status It is the status code.
 * @return string Header Message.
 */

function getStatusCodeMessage($status) {   
	
	$codes = Array(   
		100 => 'Continue',   
		101 => 'Switching Protocols',   
		200 => 'OK',   
		201 => 'Created',   
		202 => 'Accepted',   
		203 => 'Non-Authoritative Information',   
		204 => 'No Content',   
		205 => 'Reset Content',   
		206 => 'Partial Content',   
		300 => 'Multiple Choices',   
		301 => 'Moved Permanently',   
		302 => 'Found',   
		303 => 'See Other',   
		304 => 'Not Modified',   
		305 => 'Use Proxy',   
		306 => '(Unused)',   
		307 => 'Temporary Redirect',   
		400 => 'Bad Request',   
		401 => 'Access Denied',   
		402 => 'Payment Required',   
		403 => 'Forbidden',   
		404 => 'Not Found',   
		405 => 'Method Not Allowed',   
		406 => 'Not Acceptable',   
		407 => 'Proxy Authentication Required',   
		408 => 'Request Timeout',   
		409 => 'Conflict',   
		410 => 'Gone',   
		411 => 'Length Required',   
		412 => 'Precondition Failed',   
		413 => 'Request Entity Too Large',   
		414 => 'Request-URI Too Long',   
		415 => 'Unsupported Media Type',   
		416 => 'Requested Range Not Satisfiable',   
		417 => 'Expectation Failed',   
		500 => 'Internal Server Error',   
		501 => 'Not Implemented',   
		502 => 'Bad Gateway',   
		503 => 'Service Unavailable',   
		504 => 'Gateway Timeout',   
		505 => 'HTTP Version Not Supported'  
	);   

	return (isset($codes[$status])) ? $codes[$status] : '';   
}   

/**
 * This method set the HTTP header for response 
 * @param integer $status It is the status code.
 * @param string  $contentType e.g text/html.
 */
function setHeader($status,$contentType) {

		$status_header = 'HTTP/1.1 ' . $status . ' ' .getStatusCodeMessage($status);   
		header($status_header);   
		header('Content-type: '.$contentType);   

}

?>